#include "c.h"
#include "assert.h"
#include "stdio.h"

#ifndef SCREEN_W
#define SCREEN_W 800
#endif

#ifndef SCREEN_H
#define SCREEN_H 400
#endif

extern Uint8 *screen_pixeles;
extern int colores[];

extern Uint16 g_ver0, g_ver1, g_hor0, g_hor1;

void generarPlasma(Color rgb)
{
	//Alineamos el ancho de la pantalla a 4 bytes
	Uint32 ancho_pantalla_bytes = (Uint32)(SCREEN_W * 3);
	Uint32 resto = ancho_pantalla_bytes % 4;
	if(resto != 0) ancho_pantalla_bytes += 4 - resto;
	assert(ancho_pantalla_bytes % 4 == 0);

	Uint8* p_fila_pantalla = screen_pixeles;
	Uint8* p_columna_pantalla;

	Uint32 alto_pantalla = (Uint32) SCREEN_H;
	Uint32 ancho_pantalla = (Uint32) SCREEN_W;

	int x;
	Uint8 index;

	for(Uint32 fila = 0; fila < alto_pantalla; fila++)
	{
		p_columna_pantalla = p_fila_pantalla;

		for(Uint32 columna = 0; columna < ancho_pantalla; columna++)
		{
			x = colores[(g_ver0 + 5 * columna) % 512] + 
				colores[(g_ver1 + 3 * columna) % 512] +
				colores[(g_hor0 + 3 * fila   ) % 512] + 
				colores[(g_hor1 +     fila   ) % 512];

			index = 128 + (x >> 4);

			for(Uint32 pixel = 0; pixel < 3; pixel++)
			{
				if(pixel == 2)
				{
					if(rgb.b == *p_columna_pantalla &&
						rgb.g == *(p_columna_pantalla-1) &&
						rgb.r == *(p_columna_pantalla-2))
					{
						if(index < 64) {
						   *(p_columna_pantalla-2) = 255 - ( (index << 2) + 1);
						   *(p_columna_pantalla-1) = index << 2;
						   *(p_columna_pantalla-0) = 0;
					   } else if(64 <= index && index < 128) {
						   *(p_columna_pantalla-2) = (index << 2) + 1;
						   *(p_columna_pantalla-1) = 255;
						   *(p_columna_pantalla-0) = 0;
					   } else if(128 <= index && index < 192) {
						   *(p_columna_pantalla-2) = 255 - ( (index << 2) + 1);
						   *(p_columna_pantalla-1) = 255 - ( (index << 2) + 1);
						   *(p_columna_pantalla-0) = 0;
					   } else if(192 <= index && index < 256) {
						   *(p_columna_pantalla-2) = (index << 2) + 1;
						   *(p_columna_pantalla-1) = 0;
						   *(p_columna_pantalla-0) = 0;
					   } else {
						   *(p_columna_pantalla-2) = 0;
						   *(p_columna_pantalla-1) = 0;
						   *(p_columna_pantalla-0) = 0;
						}
					}
				}
				p_columna_pantalla++;
			}
		}
		p_fila_pantalla += ancho_pantalla_bytes;
	}
	g_ver0 += 9;
	g_hor0 += 8;
}
